package Management.c;

import java.sql.*;
import java.util.ArrayList;

public class loginDao
/*sql中的？代表占位符
目标对象，被代理对象
 dao层负责真正的数据库操作或者其他操作
 model负责抽象实体模型
service负责连接前端和后台，为用户提供服务
util是工具箱，里面有用途广泛的类和方法
 view就是前端，这里简单的采用控制台操作界面
 service与dao采用接口
 service使用接口是因为要面向用户，为外界前端提供接口
 dao是因为要面向具体操作，能让结构更加清晰
model包中user封装的是用户实例，
属性有id name password
构造方法和getter，setter
util中的DButil类中负责数据库的连接与关闭。
 */
{
    public ArrayList<UserInfoMstPojo> findByUname(String p_username) throws SQLException, SQLException {
/*
public ArrayList(int initialCapacity){}
给数组的长度初始化
在知道数据长度的情况下最好赋固定的值，以免不断扩充消耗性能
public ArrayList(){}
平时用的最多的，默认创建长度为10的数组
ArrayList里面有参数
private static final int DEFAULT_CAPACITY = 10;
ArrayList初始化时如果没有为ArrayList长度赋值，
创建长度为10的数组
 */

    //2. 创建连接 localhost:1433;DatabaseName=数据库名
    Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=xie", "sa", "123456");
  /*sql中的？代表占位符，  预处理执行器特有
       Connection是接口
       JdbcConnection是一个普通的类
       getConnection（）方法是静态方法
       getConnection（）方法返回的是实现了Connection接口的类的实例
       Connection是类还是接口对这句话都是正确的
       正常情况下是用类声明一个变量
       而接口是一个被特殊化了的类
       这相当于C++中的虚基类
       只要实现了这个接口的类都相当于继承了这个接口
       */
    String sql = "select id,username,password from user_mst where username=?";
    /*
    String 类中使用字符数组保存字符串
    有“final”修饰符
     string 对象 是不可变的
     privatefinalcharvalue[];
     StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类
     AbstractStringBuilder 是使用字符数组保存字符串
     */
    PreparedStatement ps = conn.prepareStatement(sql);
    //填充第几个？
        /*
        java.sql包中的PreparedStatement 接口继承了Statement
       在JDBC应用中，
       始终以PreparedStatement代替Statement
       在任何时候都不要使用Statement
        */
        ps.setString(1,p_username);
    // 3
    ArrayList<UserInfoMstPojo> ulist = new ArrayList<>();
    ResultSet rs = ps.executeQuery();
                    while (rs.next())
                    //循环语句
                    /*
                    while循环控制变量的
                    初始化一般放在while语句之前
                    循环控制变量的修改一般放在循环体中，
                    但它比较适用于循环次数不易预知的情况（用某一条件控制循环）。
                     */
                    {
        UserInfoMstPojo pojo = new UserInfoMstPojo();
        ulist.add(pojo);
        pojo.setId(rs.getInt(1));
        pojo.setUsername(rs.getString(2));
        pojo.setPassword(rs.getString(3));
                        System.out.println(rs.getString(1)+" "+rs.getString(2)+rs.getString(3));
    }
                    conn.close();
        return ulist;
    }

    public int addUserInfo(String v1, String v2) throws SQLException {

        // 2. 创建连接 localhost:1433;DatabaseName=数据库名
        Connection conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=xie", "sa", "123456");
        // sql中的？代表占位符，  预处理执行器特有
        String sql = "insert into user_mst(username,password) values(?, ?);";
        /*
    String 类中使用字符数组保存字符串
    有“final”修饰符
     string 对象 是不可变的
     privatefinalcharvalue[];
     StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类
     AbstractStringBuilder 是使用字符数组保存字符串
     */
        PreparedStatement ps = conn.prepareStatement(sql);
        // 填充第几个？
        ps.setString(1, v1);
        ps.setString(2, v2);

        // 3
        // exuecuteQuery 用于 Select  executeUpdate()用于修改CUD
        int rs = ps.executeUpdate();
        conn.close();
        return rs;
        //结束
    }
}
